import Vue from "vue";
import VueRouter from "vue-router";
import NProgress from "nprogress";
import { PrevLoading } from '@/libs/loading.js';
// import versionTood from '@/libs/versionUpdate'
Vue.use(VueRouter);

// const baseUrl = process.env.NODE_ENV === "production" ? "/v2/" : "/";
// 本语句作用是扫描指定目录下所有符合条件的文件
// 函数的三个入参分别是
// 1.要扫描的路径
// 2.是否递归扫描：true递归扫描，扫描指定文件夹下的所有子文件夹；false只扫描指定路径
// 3.正则表达式，/\.router\.js$/表示匹配以.router.js为结尾的文件
// 这里，正则表达式一定要和自己的路由信息配置文件的命名相符合，不然扫描不到
const modulesFiles = require.context("./modules", true, /\.js$/);

const routes = [];
// 如果有的路由配置文件中所编写的路由信息不止一个（是个数组），使用如下的添加方式
function registerRoute (route) {
  routes.push(route);
}
modulesFiles.keys().forEach((modulePath) => {
  const value = modulesFiles(modulePath);
  if (value.default instanceof Array) {
    value.default.forEach(registerRoute);
  } else {
    registerRoute(value.default);
  }
});

const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push (location) {
  return originalPush.call(this, location).catch(err => err)
}

// 延迟关闭进度条
export function delayNProgressDone (time = 300) {
  setTimeout(() => {
    NProgress.done();
  }, time);
}

const router = new VueRouter({
  mode: "history",
  base: '',
  routes: routes
});

// 加载 loading
PrevLoading.start();

// 路由白名单
const whiteList = ["/enroll", "/dtEquipmentDetails", "/dtDeviceImport", "/prompt"];

// 路由守卫
router.beforeEach((to, from, next) => {
  NProgress.configure({ showSpinner: false });
  NProgress.start();
  // versionTood.isNewVersion();
  if (to.path === "/login" || whiteList.includes(to.path)) {
    next();
    delayNProgressDone();
  } else {
    const token = sessionStorage.getItem("token");
    if (token) {
      next();
      delayNProgressDone();
    } else {
      next({ path: "/login" });
      delayNProgressDone();
    }
  }
});

/* 路由异常错误处理，尝试解析一个异步组件时发生错误，重新渲染目标页面 */
router.onError((error) => {
  const pattern = /Loading chunk (\d)+ failed/g;
  const isChunkLoadFailed = error.message.match(pattern);
  const targetPath = router.history.pending.fullPath;
  if (isChunkLoadFailed) {
    router.replace(targetPath);
  }
});

router.afterEach(() => {
  PrevLoading.done();
  delayNProgressDone();
});
export default router;
